package cn.bone.concurrent.demo01;

import java.util.concurrent.*;

/**
 * Created by superbone on 2017/2/14.
 *
 * CompletionService
 将生产新的异步任务与使用已完成任务的结果分离开来的服务。生产者 submit 执行的任务。使用者 take 已完成的任务，
 并按照完成这些任务的顺序处理它们的结果。例如，CompletionService 可以用来管理异步 IO ，执行读操作的任务作为程序或系统的一部分提交，
 然后，当完成读操作时，会在程序的不同部分执行其他操作，执行操作的顺序可能与所请求的顺序不同。
 通常，CompletionService 依赖于一个单独的 Executor 来实际执行任务，在这种情况下，
 CompletionService 只管理一个内部完成队列。ExecutorCompletionService 类提供了此方法的一个实现。
 */
public class MyCompletionService implements Callable<String>{

    private int id;
    public MyCompletionService(int id){
        this.id = id;
    }

    public static void main(String[] args){
        ExecutorService service = Executors.newCachedThreadPool();
        CompletionService<String> completionService = new ExecutorCompletionService<String>(service);
        for(int i=0;i<10;i++){
            completionService.submit(new MyCompletionService(i));
        }
        for(int i=0;i<10;i++){
            try {
                String str = completionService.take().get();
                System.out.println(str);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        service.shutdown();
    }

    @Override
    public String call() throws Exception {
        Integer time = (int)(Math.random()*1000);
        System.out.println(this.id+" start");
        Thread.sleep(time);
        System.out.println(this.id+" end");
        return this.id + ":" + time;
    }
}
